2nd year of Freelancing
Preface
I need to practice my English, so I write the EN version.
Right before the Chinese Qingming Festival, the Italian project I had been working on for nearly 2 years laid off all non-Italian members. Coincidentally, it was also exactly 2 years since I left my previous offline company.
I haven't written a blog in a quite a while. It feels like blogging platforms have been heavily impacted by AI. When we need to write document, we could just feed materials into AI and get something well-formatted instantly; When we need to look things up, AI is also much faster than Google search.
But I still enjoying writing things manually. Writing is like having a conversation with myself.
I do start to lose a sense of urgency and pressure after being on a project for too long. The core skill I’ve always believed I need to strengthen—spoken English—has been neglected for quite some time. Meanwhile, AI-assisted programming has made another leap over the past year. Many people’s perception has shifted from “a helpful but unreliable assistant” to “something that can fully replace humans in many areas.”
It's time to recharge and move forward.
Review of the Past Year
Besides maintaining and developing the frontend code for the payment module, I was fortunate that I was the only one in the China team willing to speak English (regardless of how well I speak). This led me to get a lot of cross-functional technical work, which was great for my career growth.
Email Service Provider Migration
In the early stages, the project used Google’s email service. Later, when we started sending multiple scheduled promotional emails, the usage became insufficient.
A backend engineer recommended SendGrid. Since I was responsible for maintaining all the email HTML templates and needed to integrate with multiple backend services, the CTO asked me to research it. That resulted in a document and a standardized development workflow.
Frontend Automated Testing with Playwright
The boss and CTO strongly pushed for testing. After evaluating several options, we select the Playwright.
The original goal was to ensure very PR could pass all the test scenarios reliably. The frontend team spent around 2 months, but unfortunately, we didn't fully achieve it, my takeaways:
- Playwright is indeed powerful. It could even be used by frontend beginners to write ticket-snatching scripts.
- But it has clear limitations. Test scenarios should be split into small, focused units, ideally 2–5 minutes each.
- When it's too complex end-to-end flows—like creating an account → creating a product → purchasing → reviewing—are a nightmare. Even with Playwright’s built-in handling of network fluctuations and delays, small instabilities accumulate over a 30-minute flow and result in frequent failures.
If I were to do it again, I would suggest:
- Keep test scenarios atomic (e.g., test registration separately from purchasing).
- Maintain dedicated test data for each scenario instead of chaining everything together.
- Periodically run large combinations of these atomic tests (weekly or monthly).
Supporting the Marketing Team
The project officially launched in June last year, and advertising started soon after.
With ads comes tracking and analysis. The CTO experimented with Google Tag Manager but realized frontend work was still needed for certain tracking cases, so I was asked to join in to support the marketing team.
Ad Tracking
We were running ads on four platforms simultaneously: LinkedIn, Meta, X, and Google Ads. Each platform has different way of publishing and tracking ads.
Combined with tools like Google Tag Manager and Google Analytics, it was quite overwhelming at first.
Eventually, I figured out a general implementation logic (diagram omitted).

When I left, I handed over a complete setup guide to a non-technical colleague, who quickly learned how to configure tracking parameters.
As for detailed configurations, there’s not much worth summarizing, they change too fast. I used to ask ChatGPT a lot, but I found many answers were based on outdated documentation. For something like ad tracking, which involves delays validation, AI didn’t feel as reliable as it does for coding.
Ad Analysis
Databox
Among the platforms we used, Google Ads had the most detailed analytics, followed by Meta.
However, since we were running campaigns across multiple platforms, we wanted a unified dashboard.
After some research, we chose Databox over Funnel. I even proposed building a small in-house analytics tool using charts and our own database, but after estimating the development and maintenance cost based on my hourly rate, the CTO rejected the idea.
Here are 2 screenshots from Databox.
It's allowing for a comparison of spend, conversion rates, and click-through rates.

This chart presents an analysis of a promotional campaign targeting a specific registered teacher (on our e-learning platform), tracking user purchasing behavior via a funnel model—from the initial click through to the final purchase.

After using Databox for a quarter, we realized the company was barely profitable—and the subscription cost ($500/month) was too high, especially since we needed MongoDB integration, which required a higher-tier plan. So we stopped using it.
Google Looker Studio
After realizing that ad spending wasn’t paying off, the company adjusted its strategy to focus only on brand advertising.
Since Databox was too expensive, I researched alternatives and found Google Looker Studio.
It supports fewer data sources, but it’s free. Connecting to BigQuery and Google Analytics is all free.
Here's one of our chart

A Brief Attempt at a React Native Project
Earlier this year, we suddenly needed to build a mobile app—apparently because investors had asked about it.
The company had tried before with a team of junior developers, but it didn’t go anywhere due to slow progress.
This time, the frontend team took over, using React Native.
There were six of us:
- Only one had real mobile app experience
- I had only built a demo before
- Two had never even used React
Thanks to AI, setting up the project, releasing builds, and developing an MVP went surprisingly smoothly. Since everyone was already familiar with the web business logic, and design requirements weren’t too strict, progress was fast.
I didn’t contribute much due to other tasks, but when I did step in, I solved a moderately complex issue that others couldn’t fix—even after asking AI multiple times. I suspect the problem was how the question was framed. With my React experience, I debugged it and found the root cause.
I also shared to conclude how to debug in React Native. react-native-optimization
What I Need to Improve
Looking back is motivating. After writing all this, I actually feel pretty confident again—it helps relieve some unemployment anxiety.
But -- this is already the age of AI.
- Although I’ve been using Cursor for more than a year, I still have a lot to learn about using AI effectively.
- English! English! English! I know it’s important, but progress feels slow. I can repeat a new word many times, yet when I try to use it later, it still feels awkward.
- Keep coding, which keep me in a good status
- Improve my personal website and portfolio.
- Maybe launch the un published APP to mobile.
I'll keep moving forward.